﻿//using FluentValidation;
//using Kele.Api.Activity.Models;
//using Newtonsoft.Json.Linq;
//using System;

//namespace Kele.Api.Activity.Engine
//{
//    public class Activity_VObject
//    {
//        public JObject Data { get; set; }
//        public Activity_Validation_Rule Rule { get; set; }
//        public string Key { get; set; }
//        public JToken Token => Data.GetValue(Key);
//    }

//    public class TypeValidator : AbstractValidator<Activity_VObject>
//    {
//        public TypeValidator()
//        {
//            When(o => o.Rule.required ?? false && o.Data.ContainsKey(o.Key), () =>
//           {
//               RuleFor(x => x.Token).NotNull().NotEmpty().WithMessage(x => x.Rule.message);

//               When(x => !string.IsNullOrEmpty(x.Rule.type), () => {
//                   RuleFor(x => x.Token).Must((x, token) => v_type(token, x.Rule.type));
//                   RuleFor(x => x.Token.ToString()).EmailAddress().When(x => x.Rule.type == "email");
//                   RuleFor(x => x.Token.ToString()).Matches(@"^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$").When(x => x.Rule.type == "url");
//               });
//               RuleFor(x => x.Token.ToString()).Matches(x => x.Rule.pattern).When(x => !string.IsNullOrEmpty(x.Rule.pattern));
//               //RuleFor(x => x.Token.ToString()).Must((x, token) => v_length(token, x.Rule.type, x.Rule.length)).When(x => x.Rule.length>0);
//               RuleFor(x => x.Token.ToString()).Must((x, token) => v_min(token, x.Rule.type, x.Rule.min)).When(x => x.Rule.min > 0);
//               RuleFor(x => x.Token.ToString()).Must((x, token) => v_max(token, x.Rule.type, x.Rule.max)).When(x => x.Rule.max > 0);
//               RuleFor(x => x.Token.ToString()).Must((x, token) => v_validator(token, x.Rule.type, x.Rule.validator)).When(x => !string.IsNullOrWhiteSpace(x.Rule.validator ));
//               RuleFor(x => x.Token.ToString()).Must((token) => string.IsNullOrWhiteSpace(token)).When(x => x.Rule.whitespace?? false);
//           });
//        }

//        protected bool v_type(JToken token, string type)
//        {
//            switch (type)
//            {
//                case "string":
//                    return token.Type == JTokenType.String;

//                case "float":
//                case "number":
//                    return token.Type != JTokenType.Float && token.Type != JTokenType.Integer;
//                case "boolean":
//                    return token.Type != JTokenType.Boolean;
//                case "integer":
//                    return token.Type != JTokenType.Integer;
//                case "array":
//                    return token.Type != JTokenType.Array;
//                case "date":
//                    return token.Type != JTokenType.Date;
//                default:
//                    return true;
//            }
//        }

//        protected bool v_length(JToken token, string type, int? length = 0)
//        {
//            switch (type)
//            {
//                case "string":
//                return length == token.ToString().Length;
//                case "array":
//                return token is JArray array ? length == array.Count : false;
//            case "number":
//                    double a = Math.Abs(length?? 0);
//                    double b = Convert.ToSingle(token);
//                return !(Math.Abs(a - b) < double.Epsilon); 
//                default:
//                return true;
//            }
       
//        }
//        protected bool v_min(JToken token, string type, int? min = 0)
//        {
//            switch (type)
//            {
//                case "string":
//                    return min <= token.ToString().Length;
//                case "array":
//                    return token is JArray array ? min <=  array.Count : false;
//                case "number":
//                    return min > token.Value<decimal>();
//                default:
//                    return true;
//            }
//        }
//        protected bool v_max(JToken token, string type, int? max = 0)
//        {
//            switch (type)
//            {
//                case "string":
//                    return max >= token.ToString().Length;
//                case "array":
//                    return token is JArray array ? max <= array.Count : false;
//                case "number":
//                    return max > token.Value<decimal>();
//                default:
//                    return true;
//            }
//        }
//        protected bool v_validator(JToken token, string type, string validator)
//        {
//            return true;
//        }
    
//    }
//}